package com.siqi.hr.system.common.dao.intf;

import com.siqi.hr.system.common.chan.TSQLSelectStat;
import com.siqi.hr.system.common.enums.FieldEditPageEnum;
import com.siqi.hr.system.common.sql.STable;
import com.siqi.hr.system.common.utils.TableDatas;
import com.siqi.hr.system.custom.entity.EntityRecord;
import com.siqi.hr.system.custom.entity.FieldRecord;
import com.siqi.hr.system.organization.entity.Employee;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import java.util.List;
import java.util.Map;

/**
 * 处理公共操作方法通用dao层
 * @version 1.0.0, Sep 25, 2016
 * @author xiaoxiumei
 * @since JDK1.6.0_12
 */
public abstract interface CommonOperationDao {
	/**
	 * 通用查询客户化实体列表数据总记录数
	 * @author                          xiaogq
	 * @param countSelectStat        拼接sql语句对象
	 * @return
	 */
	public long queryForCount(TSQLSelectStat countSelectStat);

	/**
	 * 通用查询客户化实体列表数据
	 * @author                          xiaogq
	 * @param datasSelectStat        拼接sql语句对象
	 * @return
	 */
	public TableDatas queryForList(TSQLSelectStat datasSelectStat);

	/**
	 * 通用查询客户化实体详情页面数据
	 * @author                          xiaogq
	 * @param datasSelectStat        拼接sql语句对象
	 * @return
	 */
	public Map<String,Object> queryViewDatasById(TSQLSelectStat datasSelectStat);

	/**
	 * 获取角色权限编辑页、详情页显示的字段
	 * @author               xiaoxm
	 * @param entityId      实体id
	 * @param roleId        角色id
	 * @param pageEnum      是查看页字段布局还是编辑页
	 * @return
	 * @throws Exception
	 */
	public List<FieldRecord> getEditOrViewPageFields(int entityId, String roleId,FieldEditPageEnum pageEnum) throws Exception;

	/**
	 * 通用数据保存并返回id
	 * @param dataMap            前台页面form表单提交的值
	 * @param entityRecord      实体对象
	 * @return
	 * @throws Exception
	 */
	public String addTData(final Map<String,Object> dataMap, EntityRecord entityRecord, Employee emp) throws Exception;

	/**
	 * 通用数据修改
	 * @param dataMap
	 * @param entityRecord
	 * @param emp
	 * @param id
	 * @return
	 * @throws Exception
	 */
	public int updateTData(final Map<String,Object> dataMap, EntityRecord entityRecord, Employee emp, String id) throws Exception;

	/**
	 * 通用数据删除
	 * @param table   表对象
	 * @param id       实体记录id
	 * @throws Exception
	 */
	public int deleteTData(STable table, String id) throws Exception;

	/**
	 * 如果是有回收站实体删除记录数据时更改有效数据标识
	 * @author xiaogq
	 * @param table     表对象
	 * @param id         实体记录id
	 * @throws Exception
	 */
	public void updateValidData(STable table, String id) throws Exception;

    /**
	 * 导入实体获取实体字段通用方法
	 * @author           xiaogq
	 * @param entityId   实体id
	 * @return
     */
	public Map<String, Object> getAllFieldsOfEntityExceptQuote(int entityId);

	/**
	 * 导入实体数据查询实体所有字段信息
	 * @author              xiaogq
	 * @param entityId      实体id
	 * @param ifcreatedate  是否查询添加编辑也显示字段(true:查询所有，false：查询编辑页显示字段)
     * @return
     */
	public List<FieldRecord> getAllFieldByEntity(Integer entityId,boolean ifcreatedate);

    /**
	 * 导入实体数据查询引用实体的引用字段还是非引用字段
	 * @author                   xiaogq
	 * @param quote_entity_id    引用实体id
	 * @param queryQuoteFiled    是否是查询引用实体的引用字段还是非引用字段(true:非引用字段，false:引用字段)
	 * @param ifexport           是否排除名称字段(true:排除，false:不排除)
     * @return
     */
	public List<FieldRecord> findEntityNorQuoteAndExportFields(int quote_entity_id, boolean queryQuoteFiled, boolean ifexport);

	/**
	 * 判断数据是否停用(1:停用，0：启用)
	 * @author             xiaogq
	 * @param table        实体表名
	 * @param id           记录id
	 * @return
	 */
	public boolean dataIsDisable(STable table,String id);

	/**
	 * 停用通用方法
	 * @author             xiaogq
	 * @param table        实体对应的表名
	 * @param id            实体记录id
	 * @throws Exception
	 */
	public int disableTDate(STable table, String id) throws Exception;

	/**
	 * 启用通用方法
	 * @author             xiaogq
	 * @param table        实体对应的表名
	 * @param id            实体记录id
	 * @throws Exception
	 */
	public void enableTDate(STable table, String id) throws Exception;

	/**
	 * 根据实体id查询该实体的id及name属性，返回map值(可扩展)
	 * @author ChenL
	 */
	public Map<String ,Object > getMapFields(String  pkTableName,int tableCode,String dataId) throws Exception;

	/**
	 * 删除实体记录时获取引用该外键的实体表信息
	 * @param tableName            实体表名
	 * @author   xiaogq
	 */
	public JSONArray getAllQuoteTableInfo(String tableName);

	/**
	 * 删除实体记录时判断该记录是否被其他表引用(true:被其他表引用，false：不被引用可以删除)
	 * @param quoteArray            引用该外键的表、字段信息
	 * @param id                    记录id
	 * @author   xiaogq
	 */
	public List<Map<String,Object>> isQuoteByOtherTable(JSONArray quoteArray,String id);

	/**
	 * 往z表中添加数据
	 * @author ChenL
	 */
	public int addZDate(String zTableName,String host,String related,Boolean type) throws Exception;

	/**
	 * 从z表中批量删除数据
	 * @author ChenL
	 */
	public int deleteZDate(String zTableName,String condition1,String condition2);

    /**
	 * 批量往关系表中添加关系数据
	 * @param tableName      关系表名
	 * @param hostId         主实体记录id
	 * @param relatedIds     相关实体记录ids
     * @return
     */
	public int addEntityRelation(String tableName, String hostId, String relatedIds);

}
